#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e7+5;
const ll mod=998244353;
struct dv
{
    ll p,q;
    const bool operator<(const dv &A)const
    {
        if(A.q*q>0) return p*A.q<A.p*q;
        else return p*A.q>A.p*q;
    }
};
dv R,r;
struct node
{
    ll a,b;
    const node operator+(const node &A)const
    {
        return (node){a+A.a,b+A.b};
    }
    const node operator-(const node &A)const
    {
        return (node){a-A.a,b-A.b};
    }
};
node ps[maxn][3];
ll qp(ll x,ll y)
{
    ll ret=1;
    while(y)
    {
        if(y&1) ret=ret*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return ret;
}
double ans;
double p[maxn][3];
int T,n;
ll a[maxn],A,B,C,M,num[maxn];
bool check(double x)
{
    for(int i=1;i<=n;i++) p[i][1]=(num[a[i]]>1)*x;
    p[1][0]=1-p[1][1],p[1][2]=0;
    for(int i=2;i<=n;i++)
    {
        p[i][2]=max(0.0,2*x-p[i-1][0]);
        p[i][0]=1-p[i][2]-p[i][1];
    }
    for(int i=1;i<=n;i++)
        if(p[i][0]<0 || p[i][1]<0 || p[i][2]<0 || p[i][0]>1 || p[i][1]>1 || p[i][2]>1) return 0;
    return 1;
}
double get_ans()
{
    double l=0,r=1,mid,ret=0;
    for(int i=1;i<=30;i++)
    {
        mid=(l+r)/2;
        if(check(mid)) ret=l=mid;
        else r=mid;
    }
    return ret;
}
double mn;
ll prt;
int main()
{
    //cerr<<1.0*(sizeof(p)+sizeof(a)+sizeof(num)+sizeof(ps))/1024/1024<<endl;
    freopen("guess.in","r",stdin);
    freopen("guess.out","w",stdout);
    cin>>T;
    while(T--)
    {
        mn=1e9;
        cin>>n>>a[0]>>A>>B>>C>>M;
        a[0]%=M,A%=M,B%=M,C%=M;
        for(int i=1;i<=n;i++)
        {
            a[i]=(A*(a[i-1]*a[i-1]%M)+B*a[i-1]+C)%M+1;
            num[a[i]]++;
        }
        n=0;
        for(int i=1;i<=M;i++) if(num[i]!=0) a[++n]=i;
        ans=get_ans();
        check(ans);
        for(int i=1;i<=n;i++) ps[i][1]=(node){(num[a[i]]>1),0};
        ps[1][0]=(node){0,1}-ps[1][1],ps[1][2]=(node){0,0};
        for(int i=2;i<=n;i++)
        {
            if(p[i][2]!=0) ps[i][2]=(node){2,0}-ps[i-1][0];
            else ps[i][2]=(node){0,0};
            ps[i][0]=(node){0,1}-ps[i][1]-ps[i][2];
        }
        R=(dv){1,1};
        for(int i=1;i<=n;i++)
        {
            for(int k=0;k<=2;k++)
            {
                r=(dv){1,1};
                if(ps[i][k].a<0) r=(dv){-ps[i][k].b,ps[i][k].a};
                if(r<R) R=r;
                r=(dv){1,1};
                if(ps[i][k].a>0) r=(dv){1-ps[i][k].b,ps[i][k].a};
                if(r<R) R=r;
            }
        }
        for(int i=1;i<=M;i++) num[i]=0;
        printf("%.5lf ",ans);
        cout<<((R.p%mod)*qp(R.q%mod,mod-2)%mod+mod)%mod<<'\n';
    }
    return 0;
}

